/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package isd.resto.modelo;

import isd.general.modelo.GR_Auditoria;
import isd.general.modelo.GR_Comprobante;
import isd.general.modelo.GR_Formulario;
import isd.general.modelo.GR_Sucursal;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.IdClass;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

/**
 *
 * @author Claudio
 */
@Entity
@Table(name = "rtrmvh")
public class RT_Movimiento implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "ID", nullable = false)
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;

    @JoinColumns({
    @JoinColumn(name = "MODFOR", referencedColumnName = "GRCFOR_MODFOR", nullable = false),
    @JoinColumn(name = "CODFOR", referencedColumnName = "GRCFOR_CODFOR", nullable = false)
    })
    @ManyToOne
    GR_Formulario formulario;

    @Column(name = "NROFOR", nullable = false)
    private int nrofor;

    @JoinColumn(name = "COD_ESTADO", referencedColumnName = "CODIGO", nullable = false)
    @ManyToOne
    private RT_EstadoMovimiento estado;

    //Comprobante de Facturacion
    @JoinColumns({
    @JoinColumn(name = "MODCOM", referencedColumnName = "GRCCBH_MODCOM", nullable = false),
    @JoinColumn(name = "CODCOM", referencedColumnName = "GRCCBH_CODCOM", nullable = false)
    })
    @ManyToOne
    GR_Comprobante comprobante;

    //Sucursal o punto de venta
    @JoinColumn(name = "SUCURSAL", referencedColumnName = "GRTSUC_SUCURS", nullable = false)
    @ManyToOne
    private GR_Sucursal sucursal;


    @Column(name = "FCHMOV")
    @Temporal(TemporalType.DATE)
    private Date fechaMovimiento;

    @JoinColumn(name = "COD_MESA", referencedColumnName = "CODIGO", nullable = false)
    @ManyToOne
    private RT_Mesa mesa;

    @JoinColumn(name = "COD_MOZO", referencedColumnName = "CODIGO", nullable = false)
    @ManyToOne
    private RT_Mozo mozo;

    @JoinColumn(name = "COD_SALA", referencedColumnName = "CODIGO", nullable = false)
    @ManyToOne
    private RT_Sala sala;

    @OneToMany(mappedBy = "movimiento", fetch=FetchType.LAZY, cascade=CascadeType.ALL)
    private List<RT_ItemMovimiento> items;

    @Embedded
    private GR_Auditoria auditoria;

    @Transient
    private boolean persistido;

    public RT_Movimiento() {

        fechaMovimiento = new Date();
        items = new ArrayList<RT_ItemMovimiento>();
        persistido = false;

    }

    public RT_Movimiento(GR_Formulario formulario, int nrofor) {

        this.formulario = formulario;
        this.nrofor = nrofor;

        fechaMovimiento = new Date();
        items = new ArrayList<RT_ItemMovimiento>();
        persistido = false;
    }

    public RT_Movimiento(GR_Formulario formulario) {

        this.formulario = formulario;
        this.nrofor = formulario.getUltimoNumero();        
        this.sucursal = formulario.getSucursal();

        fechaMovimiento = new Date();
        items = new ArrayList<RT_ItemMovimiento>();
        persistido = false;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public GR_Comprobante getComprobante() {
        return comprobante;
    }

    public void setComprobante(GR_Comprobante comprobante) {
        this.comprobante = comprobante;
    }

    public GR_Formulario getFormulario() {
        return formulario;
    }

    public void setFormulario(GR_Formulario formulario) {
        this.formulario = formulario;
    }   

    public RT_EstadoMovimiento getEstado() {
        return estado;
    }

    public void setEstado(RT_EstadoMovimiento estado) {
        this.estado = estado;
    }

    public Date getFechaMovimiento() {
        return fechaMovimiento;
    }

    public void setFechaMovimiento(Date fechaMovimiento) {
        this.fechaMovimiento = fechaMovimiento;
    }

    public RT_Mesa getMesa() {
        return mesa;
    }

    public void setMesa(RT_Mesa mesa) {
        this.mesa = mesa;
    }

    public RT_Mozo getMozo() {
        return mozo;
    }

    public void setMozo(RT_Mozo mozo) {
        this.mozo = mozo;
    }

    public int getNrofor() {
        return nrofor;
    }

    public void setNrofor(int nrofor) {
        this.nrofor = nrofor;
    }

    public RT_Sala getSala() {
        return sala;
    }

    public void setSala(RT_Sala sala) {
        this.sala = sala;
    }

    public GR_Sucursal getSucursal() {
        return sucursal;
    }

    public void setSucursal(GR_Sucursal sucursal) {
        this.sucursal = sucursal;
    }

    public GR_Auditoria getAuditoria() {
        return auditoria;
    }

    public void setAuditoria(GR_Auditoria auditoria) {
        this.auditoria = auditoria;
    }

    public boolean isPersistido() {
        return persistido;
    }

    public void setPersistido(boolean persistido) {
        this.persistido = persistido;
    }

    public List<RT_ItemMovimiento> getItems() {
        return items;
    }

    public void setItems(List<RT_ItemMovimiento> items) {
        this.items = items;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final RT_Movimiento other = (RT_Movimiento) obj;
        if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 5;
        hash = 79 * hash + (this.id != null ? this.id.hashCode() : 0);
        return hash;
    }

    @Override
    public String toString() {
        return "RT_Movimiento{" + "id=" + id + '}';
    }
    
}
